const callbacks = {}

/**
 * 加载一个远程脚本
 * @param {String} src 一个远程脚本
 * @param {Function} callback 回调
 */
function loadScript(src, callback) {
    const existingScript = document.getElementById(src)
    const cb = callback || (() => {
    })
    if (!existingScript) {
        callbacks[src] = []
        const $script = document.createElement('script')
        $script.src = src
        $script.id = src
        $script.async = 1
        document.body.appendChild($script)
        const onEnd = 'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script)
        onEnd($script)
    }

    callbacks[src].push(cb)

    function stdOnEnd(script) {
        script.onload = () => {
            this.onerror = this.onload = null
            callbacks[src].forEach(item => {
                item(null, script)
            })
            delete callbacks[src]
        }
        script.onerror = () => {
            this.onerror = this.onload = null
            cb(new Error(`Failed to load ${src}`), script)
        }
    }

    function ieOnEnd(script) {
        script.onreadystatechange = () => {
            if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
            this.onreadystatechange = null
            callbacks[src].forEach(item => {
                item(null, script)
            })
            delete callbacks[src]
        }
    }
}

/**
 * 顺序加载一组远程脚本
 * @param {Array} list 一组远程脚本
 * @param {Function} cb 回调
 */
export function loadScriptQueue(list, cb) {
    const first = list.shift()
    list.length ? loadScript(first, () => loadScriptQueue(list, cb)) : loadScript(first, cb)
}

export default loadScript
